package cn.com.blueInfo.bpm.template.request;

import cn.com.blueInfo.bpm.common.request.BaseDTO;
import cn.com.blueInfo.bpm.common.request.BaseQueryDTO;
import cn.com.blueInfo.bpm.template.enums.InstanceProcessStatus;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;

/**
 * 流程运行时实例表 接收参数机校验
 * @author suxch
 * @since 2025-08-24 01:41:15
 */
@Data
@EqualsAndHashCode(callSuper = true)
@Schema(description = "流程运行时实例 接收参数及校验")
public class InstanceDTO extends BaseDTO {

    /** 流程模板ID */
    @NotNull(message = "流程模板ID 不能为空")
    @Schema(description = "流程模板ID")
    private Long processId;
    /** 流程模板编码（冗余字段，便于快速识别，不参与查询等业务） */
    @Schema(description = "流程模板编码（冗余字段，便于快速识别，不参与查询等业务）")
    private String processCode;
    /** 流程标题 */
    @NotBlank(message = "流程标题 不能为空")
    @Schema(description = "流程标题")
    private String subject;
    /** 申请人ID */
    @NotNull(message = "申请人ID 不能为空")
    @Schema(description = "申请人ID")
    private Long applicantId;
    /** 申请人姓名（冗余，展示字段） */
    @Schema(description = "申请人姓名（冗余，展示字段）")
    private String applicantName;
    /** 申请部门ID */
    @NotNull(message = "申请部门ID 不能为空")
    @Schema(description = "申请部门ID")
    private Long deptId;
    /** 申请部门名称（冗余，展示字段） */
    @Schema(description = "申请部门名称（冗余，展示字段）")
    private String deptName;
    /** 申请时间（流程发起时间） */
    @NotNull(message = "申请时间 不能为空")
    @Schema(description = "申请时间（流程发起时间）")
    private LocalDateTime applyTime;
    /** 当前节点ID（NULL为已结束流程） */
    @NotNull(message = "当前节点ID 不能为空")
    @Schema(description = "当前节点ID（NULL为已结束流程）")
    private Integer currentNodeId;
    /** 实例状态：DRAFT-草稿，RUNNING-运行中，COMPLETED-已完成，CANCELED-已取消 */
    @NotNull(message = "实例状态 不能为空")
    @Schema(description = "实例状态：DRAFT-草稿，RUNNING-运行中，COMPLETED-已完成，CANCELED-已取消")
    private InstanceProcessStatus processStatus;
    /** 取消时间（状态为CANCELED时生效） */
    @Schema(description = "取消时间（状态为CANCELED时生效）")
    private LocalDateTime cancelTime;
    /** 完成时间（状态为COMPLETED时生效） */
    @Schema(description = "完成时间（状态为COMPLETED时生效）")
    private LocalDateTime completeTime;

    /**
     * 流程运行时实例 接收分页查询参数
     * @author suxch
     * @since 2025-08-21 05:08:55
     */
    @Data
    @EqualsAndHashCode(callSuper = true)
    @Schema(description = "流程运行时实例 接收分页查询参数")
    public static class QueryDTO extends BaseQueryDTO {

        /** 流程模板ID */
        @Schema(description = "流程模板ID")
        private Long processId;
        /** 流程模板编码（冗余字段，便于快速识别，不参与查询等业务） */
        @Schema(description = "流程模板编码（冗余字段，便于快速识别，不参与查询等业务）")
        private String processCode;
        /** 流程标题 */
        @Schema(description = "流程标题")
        private String subject;
        /** 申请人ID */
        @Schema(description = "申请人ID")
        private Long applicantId;
        /** 申请人姓名（冗余，展示字段） */
        @Schema(description = "申请人姓名（冗余，展示字段）")
        private String applicantName;
        /** 申请部门ID */
        @Schema(description = "申请部门ID")
        private Long deptId;
        /** 申请部门名称（冗余，展示字段） */
        @Schema(description = "申请部门名称（冗余，展示字段）")
        private String deptName;
        /** 申请时间（流程发起时间） */
        @Schema(description = "申请时间（流程发起时间）")
        private LocalDateTime applyTime;
        /** 当前节点ID（NULL为已结束流程） */
        @Schema(description = "当前节点ID（NULL为已结束流程）")
        private Integer currentNodeId;
        /** 实例状态：DRAFT-草稿，RUNNING-运行中，COMPLETED-已完成，CANCELED-已取消 */
        @Schema(description = "实例状态：DRAFT-草稿，RUNNING-运行中，COMPLETED-已完成，CANCELED-已取消")
        private InstanceProcessStatus processStatus;
        /** 取消时间（状态为CANCELED时生效） */
        @Schema(description = "取消时间（状态为CANCELED时生效）")
        private LocalDateTime cancelTime;
        /** 完成时间（状态为COMPLETED时生效） */
        @Schema(description = "完成时间（状态为COMPLETED时生效）")
        private LocalDateTime completeTime;

    }

    /**
     * 流程运行时实例 接收部分更新参数及校验
     * @author suxch
     * @since 2025-08-21 05:08:55
     */
    @Data
    @EqualsAndHashCode(callSuper = true)
    @Schema(description = "流程运行时实例 接收部分更新参数及校验")
    public static class UpdatePartialDTO extends BaseDTO {

        /** 流程模板编码（冗余字段，便于快速识别，不参与查询等业务） */
        @Schema(description = "流程模板编码（冗余字段，便于快速识别，不参与查询等业务）")
        private String processCode;
        /** 申请人姓名（冗余，展示字段） */
        @Schema(description = "申请人姓名（冗余，展示字段）")
        private String applicantName;
        /** 申请部门名称（冗余，展示字段） */
        @Schema(description = "申请部门名称（冗余，展示字段）")
        private String deptName;
        /** 取消时间（状态为CANCELED时生效） */
        @Schema(description = "取消时间（状态为CANCELED时生效）")
        private LocalDateTime cancelTime;
        /** 完成时间（状态为COMPLETED时生效） */
        @Schema(description = "完成时间（状态为COMPLETED时生效）")
        private LocalDateTime completeTime;

    }

}